﻿using System;

namespace DCS.Structs
{    

#region Task structs

    /// <summary>
    /// Структура хранения задачи.
    /// </summary>
    [Serializable]
    public struct TaskPackStruct
    {
        /// <summary> GUID задачи. </summary>
        public Guid Guid;

        /// <summary> Имя задачи. </summary>
        public string TaskName;

        /// <summary> Текущая порция задачи (для расчёта клиентом). </summary>
        public uint Portion;

        /// <summary> Число порций задачи. </summary>
        public uint PortionsNumber;

        /// <summary> Срок хранения задачи (актуален до...). </summary>
        public DateTime Deadline;

        /// <summary> Приоритет задачи. </summary>
        public Int16 Priority;

        /// <summary> Описание задачи. </summary>
        public string Summary;

        /// <summary> Вычислительный модуль. </summary>
        public ComputationModule ComputationModule;

        /// <summary> Массив зависимостей задачи.</summary>
        public Dependency[] Dependencies;
    }
   
    /// <summary> Вычислительный модуль. </summary>
    [Serializable]
    public struct ComputationModule
    {
        // Имя вычислительного модуля
        /// <summary> </summary>
        public string ModuleName;

        /// <summary> </summary>
        public byte[] ComputationModuleData;
    }

    /// <summary>
    /// Бинарная зависимость, необходимые для расчёта задания.
    /// </summary>
    [Serializable]
    public struct Dependency
    {
        /// <summary> Имя зависимости. </summary>
        public string DependencyName;

        /// <summary> Бинарные данные зависимости. </summary>
        public byte[] DependencyData;
    }

    /// <summary> Суммарная информация о задачи. </summary>
    [Serializable]
    public struct TaskInfo
    {
        /// <summary> Идентификатор. </summary>
        public Guid Id;

        /// <summary> Имя задачи. </summary>        
        public string Name;

        /// <summary> Состояние задачи. </summary>
        public string State;

        /// <summary> Максимальный срок выполнения. </summary>       
        public DateTime Deadline;

        /// <summary> Текущий прогресс выполнения (%). </summary>
        public float Progress;

        /// <summary> Приоритет задачи. </summary>        
        public string Priority;
    }

#endregion

#region Result structs

    /// <summary>
    /// Структура для представления частичного результата рассчёта. 
    /// </summary>
    [Serializable]
    public struct PortionResultStruct
    {
        /// <summary> Идентификатор задачи, которой принадлежит результат. </summary>
        public Guid TaskGuid;

        /// <summary> Номер посчитанной порции, которму соответствует результат. </summary>
        public uint PortionNumber;

        /// <summary> Массив результирующих файлов. </summary>
        public ResultFile[] ResultFiles;
    }

    /// <summary> 
    /// Структура для представления файла результата. 
    /// </summary>
    [Serializable]
    public struct ResultFile
    {
        /// <summary> Имя результирующего файла. </summary>
        public string FileName;

        /// <summary> Бинарные данные. </summary>
        public byte[] FileData;
    }

    /// <summary> 
    /// Структура для представления результата рассчёта. 
    /// </summary>
    [Serializable]
    public struct TaskResultStruct
    {
        /// <summary> Идентификатор задачи, которой принадлежит результат. </summary>
        public Guid TaskGuid;

        /// <summary> Массив результирующих файлов. </summary>
        public PortionResultStruct[] PartialResults;
    }

#endregion

#region Statistics structs

    /// <summary>
    /// Структура информации о вычислительном клиенте
    /// </summary>
    [Serializable]
    public struct ClientCharacteristicsStruct
    {
        /// <summary> Оперативная память (Mb). </summary>
        public uint RAM;

        /// <summary> Тактовая частота процессора (Ghz). </summary>
        public float CpuFrequency;

        /// <summary> Число ядер. </summary>
        public int CoreCount;

        /// <summary> Доступное место на жёстком диске (Mb). </summary> 
        public uint availableMemory;
    }

    /// <summary>
    /// Состояние сервиса.
    /// </summary>
    [Serializable]
    public struct ServiceState
    {
        // Число активных клиентов
        /// <summary> </summary>
        public int ActiveClientsCount;

        // Число задач, находящихся на обработке
        /// <summary> </summary>
        public int ActiveTasksCount;

        // Массив состояний заданий
        /// <summary> </summary>
        public TaskState[] TasksStates;
    }

    /// <summary>
    /// Структура статистики работы сервиса. 
    /// </summary>
    [Serializable]
    public struct ServiceWorkStatistics
    {
        /// <summary> Число активных клиентов. </summary>
        public uint ActiveClientsCount;

        /// <summary> Число клиентов, зарегистрированных с момента запуска сервиса. </summary>
        public uint RegisteredClientsCount;

        /// <summary> Число задач, находящихся на обработке. </summary>
        public uint ActiveTasksCount;

        /// <summary> Число обработанных задач. </summary>
        public uint CompletedTasks;

        /// <summary> Время работы сервиса. </summary>
        public DateTime ActionTime;
    }

#endregion

#region Auxiliary strucs

    /// <summary>
    /// Вспомонательная структура.
    /// </summary>
    [Serializable]
    public struct Utility
    {        
        /// <summary> Массив приоритетов задач. </summary>
        public static string[] Priorities = new string[] { "Low", "Normal", "High" };
//        public static string[] States = new string[] { "New", "Active", "Completed" };
    }

    /// <summary> 
    /// Состояние задачи. 
    /// </summary>
    [Serializable]
    public struct TaskState
    {
        /// <summary> 
        /// Новое задание. 
        /// Было добавлено на сервер, но ни одной порции посчитано не было. 
        /// </summary>
        public static string New = "New";

        /// <summary>
        /// Активное задание.
        /// С момента добвления на сервер была посчитана как минимум одна порция.
        /// </summary>        
        public static string Active = "Active";

        /// <summary> 
        /// Расчитанное задание.
        /// Все порции были успешно обработаны.
        /// </summary>
        public static string Completed = "Completed";
    }

#endregion

}